// @/utils/date.js

/**
 * 格式化日期时间
 * @param {number|string|Date} timestamp - 时间戳(秒/毫秒)、日期字符串或Date对象
 * @param {string} format - 格式字符串，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(timestamp, format = 'YYYY-MM-DD') {
    // 处理空值
    if (!timestamp) return '';
    
    let date;
    
    // 已经是Date对象
    if (timestamp instanceof Date) {
        date = timestamp;
    } 
    // 处理后台传的 "2024-05-01 00:00" 格式
    else if (typeof timestamp === 'string' && timestamp.includes(' ')) {
        date = new Date(timestamp.replace(' ', 'T') + ':00');
    }
    // 处理ISO格式字符串 (如 "2024-05-01T00:00:00")
    else if (typeof timestamp === 'string' && timestamp.includes('T')) {
        date = new Date(timestamp);
    }
    // 处理简化的日期格式 (如 "2024-05-01")
    else if (typeof timestamp === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(timestamp)) {
        date = new Date(timestamp + 'T00:00:00');
    }
    // 处理数字时间戳（支持秒级或毫秒级）
    else if (typeof timestamp === 'number') {
        date = new Date(timestamp > 9999999999 ? timestamp : timestamp * 1000);
    }
    // 其他情况返回空字符串
    else {
        return '';
    }

    // 处理无效日期
    if (isNaN(date.getTime())) {
        return '';
    }

    const padZero = num => (num < 10 ? `0${num}` : num);

    const replacements = {
        YYYY: date.getFullYear(),
        MM: padZero(date.getMonth() + 1),
        DD: padZero(date.getDate()),
        HH: padZero(date.getHours()),
        mm: padZero(date.getMinutes()),
        ss: padZero(date.getSeconds()),
    };

    return format.replace(/YYYY|MM|DD|HH|mm|ss/g, match => replacements[match]);
}
  
  /**
   * 获取相对时间（如"3天前"）
   * @param {number|string|Date} timestamp - 时间戳或Date对象
   * @returns {string} 相对时间字符串
   */
  export function relativeTime(timestamp) {
    const now = new Date()
    const date = timestamp instanceof Date ? timestamp : new Date(
      typeof timestamp === 'string' ? parseInt(timestamp) : timestamp > 9999999999 
        ? timestamp 
        : timestamp * 1000
    )
    
    const diffInSeconds = Math.floor((now - date) / 1000)
    
    if (diffInSeconds < 60) return `${diffInSeconds}秒前`
    if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / 60)}分钟前`
    if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / 3600)}小时前`
    if (diffInSeconds < 2592000) return `${Math.floor(diffInSeconds / 86400)}天前`
    if (diffInSeconds < 31536000) return `${Math.floor(diffInSeconds / 2592000)}个月前`
    return `${Math.floor(diffInSeconds / 31536000)}年前`
  }
  
  /**
   * 计算两个日期之间的天数差
   * @param {Date|number} date1 - 第一个日期
   * @param {Date|number} date2 - 第二个日期
   * @returns {number} 天数差（绝对值）
   */
  export function daysBetween(date1, date2) {
    const d1 = date1 instanceof Date ? date1 : new Date(date1)
    const d2 = date2 instanceof Date ? date2 : new Date(date2)
    return Math.floor(Math.abs(d1 - d2) / (1000 * 60 * 60 * 24))
  }
  
  /**
   * 获取当天的开始时间（00:00:00）
   * @param {Date} date - 基准日期，默认为当前日期
   * @returns {Date} 当天开始时间的Date对象
   */
  export function getStartOfDay(date = new Date()) {
    const d = new Date(date)
    d.setHours(0, 0, 0, 0)
    return d
  }
  
  /**
   * 获取当天的结束时间（23:59:59）
   * @param {Date} date - 基准日期，默认为当前日期
   * @returns {Date} 当天结束时间的Date对象
   */
  export function getEndOfDay(date = new Date()) {
    const d = new Date(date)
    d.setHours(23, 59, 59, 999)
    return d
  }
  
  /**
   * 判断是否是同一天
   * @param {Date|number} date1 - 第一个日期
   * @param {Date|number} date2 - 第二个日期
   * @returns {boolean} 是否是同一天
   */
  export function isSameDay(date1, date2) {
    const d1 = date1 instanceof Date ? date1 : new Date(date1)
    const d2 = date2 instanceof Date ? date2 : new Date(date2)
    return (
      d1.getFullYear() === d2.getFullYear() &&
      d1.getMonth() === d2.getMonth() &&
      d1.getDate() === d2.getDate()
    )
  }
  
  export default {
    formatDate,
    relativeTime,
    daysBetween,
    getStartOfDay,
    getEndOfDay,
    isSameDay
  }